package cn.cai.authority.impl;

import cn.cai.authority.MyAuthorityPermit;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;


/**
 * 本类型的对象，必须被Spring容器管理。否则在Security配置类型中，无法获取对象。
 * 常使用路径地址作为映射规则。直接匹配资源信息。不匹配角色信息。
 * 数据库中保存的权限数据是：/login  /logout   /toMain  /failure   /success 等。
 * 代码中，通过请求对象，获取请求地址。 request.getServletPath()
 * 校验
 */
@Component
public class MyAuthorityPermitImpl implements MyAuthorityPermit {
    /**
     * 定义，请求参数中包含权限相关信息。
     * 参数名：roles;  参数值：字符串数组。代表本次请求地址，需要的访问权限。
     * 参数名：authorities: 参数值：字符串数组。代表本次请求地址，需要的访问权限。
     * @param request  请求对象，可以通过请求对象获取请求路径，请求参数，请求作用域数据。
     * @param authentication 用户登录后，Spring Security 维护的用户登录标记。内部包含登录用户的名称和权限集合
     * @return
     */
    @Override
    public boolean hasAuthority(HttpServletRequest request, Authentication authentication) {

        // 获取客户端请求地址
        // request.getServletPath();

        // 获取请求参数
        String[] roles = request.getParameterValues("roles");
        String[] authorities = request.getParameterValues("authorities");

        // 获取当前登录用户拥有的权限集合列表

        System.out.println("权限集合：" + authentication.getAuthorities());
        System.out.println("身份："+ authentication.getPrincipal());
        System.out.println("凭证："+ authentication.getCredentials());
        System.out.println("明细："+ authentication.getDetails());
        System.out.println("是否登录：" + authentication.isAuthenticated());

        for (String role: roles){ // 判断角色
            String tmp = "ROLE_" + role;  // 拼接前缀
            // 判断用户权限集合中，是否包含当前请求路径需要的权限
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(tmp))){
                // 登录用户有权限，可以访问
                return true;
            }
        }

        for (String authority : authorities){ // 判断资源权限
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(authority))){
                // 登录用户有权限
                return true;
            }
        }

        // 登录用户无权限
        return false;
    }
}
